#ifndef __UBT_MAP_MANAGER_H__
#define __UBT_MAP_MANAGER_H__


#include <string>
#include <thread>

#include <jsoncpp/json/json.h>

#include "config.h"
#include "ubt_yaml_config.h"
#include "ubt_utils.h"
#include <ubt_mqtt/node.h> 

namespace ubt {

class CMapManager
{
private:

    location_pose_t _origin_map_pose; // 地图初始坐标
    float _map_resolution; // 地图分辨率
    float _map_height;
    float _map_width;

    float _map_confidence; // 地图置信度
    std::string _map_hash; // 上一次设置地图的hash值
    map_origin_info_t _map_origin_info;

    std::string _map_id; // 地图id
    std::string _gmapping_ros;  // amr gmmaping 节点路径

    std::atomic_bool _gmapping_launch_status;

    /**
     * @brief 保存站点信息(休息点/充电点)
     * @param mapPoints :站点信息组
     */
    bool UpdateLocalPointInfo(const Json::Value& mapPoints);
    bool UpdateMapOriginFile();
    bool SaveMapImage(const std::string& mapdata);

    void ThreadProc(void);
public:
    CMapManager();
    virtual ~CMapManager();

    bool StartGmappingLaunch();

    /**
     * @brief 更新地图信息，在节点启动/地图更新后执行
     */
    void UpdateMapInfo();

    /**
     * @brief 处理地图数据
     * @param map_data : map 信息数据
     * @param has_new_map : 是否有新地图
     */
    bool HandleMapInfoData(const Json::Value &map_data, const std::function<void(void)> notify = nullptr);

    /**
     * @brief 坐标转换
     * srcPose：　要转换的坐标
     * destPose：　转换后的坐标
     */
    bool WorldToMap(const location_pose_t &srcPose, location_pose_t &destPose);

    bool MapToWorld(const location_pose_t &srcPose, location_pose_t &destPose);

    void setMapConfidence(float confidence) { _map_confidence = confidence; }
    float getMapConfidence() { return _map_confidence; }

    const map_origin_info_t& getMapOriginInfo() { return _map_origin_info; }

    const std::string& getMapId() { return _map_id; }
};

}

#endif // !__UBT_MAP_MANAGER_H__

